package com.lugora.bi;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableScheduling;

// todo 如需开启 Redis，须移除 exclude 中的内容
@SpringBootApplication(exclude = {RedisAutoConfiguration.class})
@MapperScan("com.lugora.bi.mapper")
@EnableScheduling
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
public class MainApplication {

    public static void main(String[] args) {
        /*
        1. 将用户上传的每一个表格都新建一个表格放在数据库中(分开存储、查询性能更快、灵活取出需要的字段), Mybatis 动态 sql
        2. 限流(本地限流、多机限流)、限流算法(固定窗口限流、滑动窗口限流、漏桶限流、令牌桶限流)
        3. 资源隔离，重要的任务一个队列，不重要的任务另一个队列(VIP)

        消息队列：
        1. 解耦: 消息队列允许系统过的生产者和消费者相互独立运行，生产者只需要将消息发送到队列，而不需要关心消息的具体处理方式或处理结果。
        2. 异步处理: 消息队列支持异步通信，生产者可以快速将消息放入队列，而不需要等待消费者完成处理，从而提高系统的整体响应速度。
        3. 削峰填谷: 消息队列可以缓冲突发的大量请求，避免系统过载，消费者可以按能力逐步处理，防止系统崩溃。
        4. 可靠性保证: 可以通过消息持久化、重试机制和确认机制，消息队列可以确保消息不丢失并可靠投递到消费者。
        5. 广播和多消费者支持: 消息队列支持一个消息多个消费者接收和处理(发布/订阅模式)，实现消息的广泛分发。
        6. 流量控制: 通过限制消费者的消费速度或队列的消费速率，消息队列能有效平衡资源使用，防止过载。


        消息队列和线程池比较：
        比较维度        消息队列                线程池
        核心功能        服务解耦、异步通信       并发任务管理、线程复用
        使用场景        分布式服务间的消息传递     单机多线程任务处理
        是否持久化       支持持久化和消息确认      无持久化，需手动保存结果
        数据传递方式      通过消息传递数据        通常通过共享变量或队列通信
        异步支持        天生支持异步              默认同步，可结合异步框架

        跨系统解耦：消息队列（分布式系统协作、高并发、耗时、强稳定场景（持久化、可靠性、削峰填谷））
        单系统高并发：线程池

        消息队列缺点：
        1. 要给系统引入额外的中间件、系统会更加复杂、额外维护中间件、额外的成本
        2. 消息丢失、顺序性、防止重复消费、数据的一致性
         */
        SpringApplication.run(MainApplication.class, args);
    }

}
